async function main() {
    const H264bsdWasm = require('./h264bsd_wasm');
    const H264bsdDecoder = require('./h264bsd_decoder');

    // Load input data
    const util = require('util');
    const fs = require('fs');
    const readFile = util.promisify(fs.readFile);
    const data = await readFile('../test/test_1920x1080.h264');

    // Create a decoder instance
    var decoder = new H264bsdDecoder(H264bsdWasm);
    decoder.onPictureReady = onPictureReady;
    decoder.onHeadersReady = onHeadersReady;
    decoder.queueInput(data);

    var pictureCount = 0;

    function onPictureReady() {
        ++pictureCount;
    }

    function onHeadersReady() {
        var width = decoder.outputPictureWidth();
        var height = decoder.outputPictureHeight();
        var croppingParams = decoder.croppingParams();
    
        console.log("Headers parsed", {
            'width' : width,
            'height' : height,
            'croppingParams' : croppingParams,
        });
    }

    var result = H264bsdDecoder.RDY;
    var start = process.hrtime();

    while(result != H264bsdDecoder.NO_INPUT) {
        result = decoder.decode();

        switch(result) {
            case H264bsdDecoder.ERROR:
                throw new Error('Decoder Error');
            case H264bsdDecoder.PARAM_SET_ERROR:
                throw new Error('Parameter Set Error');
            case H264bsdDecoder.MEMALLOC_ERROR:
                throw new Error('MemAlloc Error');
        }
    }

    var end = process.hrtime();
    var totalSeconds = (end[0] + end[1] / 1e9) - (start[0] + start[1] / 1e9);
    var fps = pictureCount / totalSeconds
    console.log("Decoded %d frames in %s seconds (%s fps)", pictureCount, totalSeconds.toFixed(2), fps.toFixed(2));
}

main();
